/**
 * @author : andy
 * @description : 统一登录功能
 */
import authClient from 'account-auth-sdk';
import type { AuthClient, SDKOptions } from 'account-auth-sdk/lib/types';

const getAppConfig = () => {
  return localStorage.getItem('app_config') ? JSON.parse(localStorage.getItem('app_config')!) : undefined; 
}

export default class Auth {
  static auth: AuthClient | null = null;
  static isLogin: boolean = false;
  /**
   * 绑定登出时的回调
   * @param callback 登出时的回调
   */
  static bindLogoutCallback (callback: () => void) {
    Auth.auth?.setLogoutHook(() => {
      callback();
      return window.location.href;
    })
  }
  /**
   * 初始化auth对象，用于登录
   */
  static initAuth () {
    if (!Auth.auth) {
      const appConfig = getAppConfig();
      Auth.auth = authClient.create(appConfig.config.auth as SDKOptions);
    }
  }
  /**
   * 
   * @param payload 参数，用于保存登录前的路由状态（其他状态都可以，根据业务来定）payload:{url: 'xxx'}
   * @returns 返回payload参数，用于恢复路由地址
   */
  static async login (payload: {url: string; [key: string]: any}) {
    const result = Auth.auth?.ssoLogin({
      state : payload
    })
    if (!result) {
      return;
    }
    await Auth.auth?.grantToken({
      grantType : 'authorization_code',
      parameters : {}
    });
    Auth.isLogin = true;
    return result;
  }
  /**
   * 获取token
   */
  static getToken () {
    return Auth.auth?.accessToken();
  }
  /**
   * 刷新token
   * @param redirectUrl 重定向url地址，如果刷新token异常，那么就会退出登录
   */
  static async refreshToken (redirectUrl?: string) {
    try {
      await Auth.auth?.refreshToken();
    } catch (err) {
      this.logout(redirectUrl);
    }
  }
  /**
   * 登出
   * @param redirectUrl 重定向地址
   */
  static logout (redirectUrl?: string) {
    Auth.isLogin = false;
    Auth.auth?.ssoLogout(redirectUrl);
  }
  /**
   * 检查是否登录
   */
  static checkLogin () {
    return Auth.isLogin;
  }
}